package com.fotkidemo.network.json;


import android.util.Log;
import com.fotkidemo.beans.EntryElement;
import com.fotkidemo.util.EntryCaches;
import com.fotkidemo.util.EntryElementCache;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Created with IntelliJ IDEA.
 * User: roma
 * Date: 6/18/12
 * Time: 1:43 AM
 * To change this template use File | Settings | File Templates.
 */

/**
 * Абстрактный класс отвечает за разбор json ответа
 * Каждый отдельный entry-елемент в json ответе разбирается отдельно
 * при помощи специальных классов JsonAlbumsParser и JsonImagesParser,
 * при помощи переопределения метода parseEntry.
 */
public abstract class AbstractJsonEntryParser {
    String json;

    public AbstractJsonEntryParser(String json) {
        this.json = json;
    }

    /**
     * Разбор строки в формате json.
     * Во время разбора entry-елемены добавляются в кэш.
     * Если кэш уже был заполнен и дата обновления кэша не изменилась, дальнейший разбор прекращается.
     * @return id кэша набора entry-елементов определенной коллекции на сервере
     */
    public String parse() {
        String id = "";
        try {
            JSONObject jsonObject = new JSONObject(json);

            String updated = jsonObject.getString("updated");
            updated = updated.replace("T", " ");
            updated = updated.replace("Z", "");
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date date = df.parse(updated);

            id = jsonObject.getString("id");
            EntryElementCache<EntryElement> cache = EntryCaches.getInstance().getCache(id);
            cache.setDate(date);
            if (cache.isUpdated()) {
                JSONArray entries = jsonObject.getJSONArray("entries");
                for (int i = 0; i < entries.length(); i++) {
                    JSONObject entry = entries.getJSONObject(i);
                    updated = entry.getString("updated");
                    updated = updated.replace("T", " ");
                    updated = updated.replace("Z", "");
                    date = df.parse(updated);

                    EntryElement element = parseEntry(entry, entry.getString("id"), entry.getString("author"),
                            entry.getString("title"), date);
                    cache.put(element.getId(), element);
                }
                cache.updated();
            }
            return id;
        } catch (JSONException e) {
            Log.e(getTag(), e.getMessage());
        } catch (ParseException e) {
            Log.e(getTag(), e.getMessage());
        }
        return "";
    }

    /**
     * Детальный разбор entry-елемента, представляющего альбом или картинку
     */
    protected abstract EntryElement parseEntry(JSONObject entry, String id, String author, String title, Date date) throws JSONException;
    protected abstract String getTag();
}
